// 剑指 Offer II 061. 和最小的 k 个数对
// https://leetcode.cn/problems/qn8gGX/
// 中等,给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。
// 定义一对值 (u,v)，其中第一个元素来自 nums1，第二个元素来自 nums2 。
// 请找到和最小的 k 个数对 (u1,v1),  (u2,v2)  ...  (uk,vk) 。
// 示例 1:
// 输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
// 输出: [1,2],[1,4],[1,6]
// 解释: 返回序列中的前 3 对数：
//     [1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]
// 示例 2:
// 输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
// 输出: [1,1],[1,1]
// 解释: 返回序列中的前 2 对数：
//      [1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]
// 示例 3:
// 输入: nums1 = [1,2], nums2 = [3], k = 3
// 输出: [1,3],[2,3]
// 解释: 也可能序列中所有的数对都被返回:[1,3],[2,3]
#include <bits/stdc++.h>
using namespace std;

class Solution {
//    struct NumPair {
//        int x = 0 , y = 0;
//        bool operator> (const NumPair& other) const {
//            return false;
//        }
//    };
//    vector<int> a1,a2;
public:
    vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
        auto cmp = [&nums1, &nums2](const pair<int, int> & a, const pair<int, int> & b) {
            return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second];
        };

        vector<vector<int>> ans;
        priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> minQu(cmp);
        for (int i = 0; i < min(k, (int)nums1.size()); i++) {
            minQu.push({i, 0});
        }
        for (int i = 0; i < k && minQu.size() > 0; i++) {
            auto [x,y] = minQu.top(); minQu.pop();
            ans.push_back({nums1[x],nums2[y]});
            if (y + 1 < nums2.size()) {
                minQu.push({x, y+1});
            }
        }
        return ans;
    }
};

int main() {
	return 0;
}

